package com.java.thread;

/**
 * Guarded Suspention模式
 * 考虑这么一个伺服器，它可以处理来自多个客户端的服务请求（Request），为了不丢失客户的请求，它要维持一个缓冲区，客户的请求会先储存至缓冲区中，而伺服器会从缓冲区中取出请求并执行，如果缓冲区中没有请求，则伺服器就等待，直到被通知有新的请求存入缓冲区中，伺服器再度进行请求的执行
 * 当条件不满足，线程等待，直到条件满足时，等待该条件的线程被唤醒
 * 设计一个客户端线程和一个服务器线程，客户端线程不断发送请求给服务器线程，服务器线程
 * 不断处理请求，当请求队列为空时，服务器线程就必须等待，直到客户端发送了请求
 * @author Administrator
 *
 */
public class TestGuardedSuspentionPattern {
	private final static int REQUEST_COUNT=10;
	private final static int serverCount = 10;
	private final static int clientCount =20;
	public static void main(String[] args) {
		
		Queue queue = new Queue();
//		ServerThread serverThread = new ServerThread(queue);
//		serverThread.start();
		
		ServerThread[] servers = new ServerThread[serverCount];
		
		for(int i=0;i<servers.length;i++){
			servers[i] = new ServerThread(queue);
			servers[i].start();
		}
		
		ClientThread[] clients = new ClientThread[clientCount];
		for(int i=0;i<clients.length;i++){
			clients[i] = new ClientThread(queue,i+"",REQUEST_COUNT);
			clients[i].start();
		}
		
		while(true){			//监听线程，监听server和client是否工作完毕，完毕则让server下班
			int count=0;
			int c = clients.length;
			for(int i=0;i<clients.length;i++){
				if(!clients[i].isAlive()){
					count+=1;
				}
			}
			int serverProcess=0;
			for(int i=0;i<servers.length;i++){
				serverProcess+=servers[i].getProcessCount();
			}
			
			
//			if(count == c && serverThread.getProcessCount() == (c*workCount)){
//				break;
//			}
			
			if(count == c && serverProcess == (c*REQUEST_COUNT)){
				break;
			}
		}
//		serverThread.shutdown();
		
		for(int i=0;i<servers.length;i++){
			servers[i].shutdown();
		}
		
	}

}

